import argparse
import re
import os

# 统计字符数
def chars_count(text):
    return len(text)

# 统计单词数
def words_count(text):
    words = re.findall(r'\b\w+\b', text)
    return len(words)

# 统计句子数
def lines_count(text):
    lines = re.split(r'[\.\?\!]\s', text)
    return len(lines)

# 根据文件扩展名判断编程语言
def detect_language(file_path):
    _, ext = os.path.splitext(file_path)
    ext = ext.lower()
    if ext == ".py":
        return "python"
    elif ext in [".c", ".h"]:
        return "c"
    elif ext in [".cpp", ".hpp", ".cc"]:
        return "cpp"
    elif ext == ".java":
        return "java"
    elif ext in [".js"]:
        return "javascript"
    else:
        print("无法识别的文件类型，默认使用 Python 注释风格")
        return "python"  # 默认使用 Python 作为注释风格

# 统计代码行、空行、注释行，支持多种语言
def code_lines_count(text, comment_type):
    code_lines = 0
    empty_lines = 0
    comment_lines = 0

    # 根据语言类型设定注释符号
    if comment_type == "python":
        single_line_comment = "#"
        multi_line_comment_start = '"""'
        multi_line_comment_end = '"""'
    elif comment_type in ["c", "cpp", "java", "javascript"]:
        single_line_comment = "//"
        multi_line_comment_start = "/*"
        multi_line_comment_end = "*/"
    else:
        return 0, 0, 0

    in_multi_line_comment = False
    for line in text.splitlines():
        stripped_line = line.strip()
        
        if not stripped_line:
            empty_lines += 1
        elif in_multi_line_comment:
            # 判断多行注释结束
            if multi_line_comment_end in stripped_line:
                in_multi_line_comment = False
            comment_lines += 1
        elif stripped_line.startswith(multi_line_comment_start):
            # 判断多行注释开始
            in_multi_line_comment = True
            comment_lines += 1
        elif stripped_line.startswith(single_line_comment):
            comment_lines += 1
        else:
            code_lines += 1

    return code_lines, empty_lines, comment_lines

def main():
    parser = argparse.ArgumentParser(description='命令行文本计数统计程序')
    parser.add_argument('file_path', help='文件路径')
    parser.add_argument('-c', action='store_true', help='统计字符数')
    parser.add_argument('-w', action='store_true', help='统计单词数')
    parser.add_argument('-l', action='store_true', help='统计句子数（行数）')
    parser.add_argument('-C', action='store_true', help='统计代码行数')
    parser.add_argument('-E', action='store_true', help='统计空行数')
    parser.add_argument('-M', action='store_true', help='统计注释行数')
    
    args = parser.parse_args()

    # 读取文件内容
    try:
        with open(args.file_path, 'r', encoding='utf-8') as file:
            text = file.read()
    except Exception as error:
        print(f"无法打开文件 {args.file_path}，错误信息: {error}")
        return

    # 自动检测文件语言
    language = detect_language(args.file_path)

    # 命令行结果输出
    if args.c:
        print(f"字符数: {chars_count(text)}")
    
    if args.w:
        print(f"单词数: {words_count(text)}")
    
    if args.l:
        print(f"句子数: {lines_count(text)}")
    
    # 统计代码行、空行和注释行
    if args.C or args.E or args.M:
        code_lines, empty_lines, comment_lines = code_lines_count(text, language)
        
        if args.C:
            print(f"代码行数: {code_lines}")
        
        if args.E:
            print(f"空行数: {empty_lines}")
        
        if args.M:
            print(f"注释行数: {comment_lines}")

if __name__ == '__main__':
    main()